// src/utils/fileUtils.js
const fs = require('fs-extra');
const path = require('path');
const { exec } = require('child_process');
const util = require('util');

// 将exec转换为Promise形式
const execPromise = util.promisify(exec);

/**
 * 获取文件列表
 * @param {string} dirPath 目录路径
 * @returns {Promise<Object>} 结果对象
 */
async function fileList(dirPath) {
  try {
    // 创建一个存储文件名的列表
    const fileNames = [];
    
    // 如果传入的路径为空，获取所有磁盘根目录
    if (!dirPath || dirPath === '') {
      // Windows系统和其他系统的处理方式不同
      if (process.platform === 'win32') {
        try {
          // 使用wmic命令获取所有磁盘信息
          const { stdout } = await execPromise('wmic logicaldisk get caption');
          
          // 解析命令输出获取盘符列表
          const drives = stdout.split('\r\r\n')
            .filter(line => /^[A-Z]:/.test(line))
            .map(drive => drive.trim());
          
          return {
            code: 200,
            message: 'success',
            data: drives
          };
        } catch (error) {
          // 如果wmic命令失败，使用备选方法
          const drives = [];
          // 检查常见的Windows盘符
          for (const letter of 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') {
            const drivePath = `${letter}:\\`;
            try {
              if (fs.existsSync(drivePath)) {
                drives.push(`${letter}:`);
              }
            } catch (e) {
              // 忽略错误继续检查下一个盘符
            }
          }
          
          return {
            code: 200,
            message: 'success',
            data: drives
          };
        }
      } else {
        // 非Windows系统，返回根目录
        return {
          code: 200,
          message: 'success',
          data: ['/']
        };
      }
    } else {
      // 如果传入的路径不为空，获取该目录下一级的所有文件夹
      try {
        // 确保路径格式一致
        let normalizedPath;
        
        if (process.platform === 'win32' && /^[A-Za-z]:$/.test(dirPath)) {
          // 如果是形如"C:"的盘符格式，添加反斜杠使其成为根目录路径
          normalizedPath = dirPath + '\\';
        } else {
          // 其他情况正常处理
          normalizedPath = path.normalize(dirPath);
        }
        
        console.log('处理的路径:', normalizedPath); // 用于调试

        // 检查是否是一个目录
        const stats = await fs.stat(normalizedPath);
        if (!stats.isDirectory()) {
          return {
            code: 400,
            message: '不是一个目录',
            data: null
          };
        }
        
        // 读取目录内容
        const items = await fs.readdir(normalizedPath);
        
        // 遍历该目录下的文件和文件夹
        for (const item of items) {
          const itemPath = path.join(normalizedPath, item);
          try {
            // 检查是否是目录
            const itemStats = await fs.stat(itemPath);
            if (itemStats.isDirectory()) {
              fileNames.push(item);
            }
          } catch (error) {
            // 忽略无法访问的文件或目录
            console.warn(`无法访问: ${itemPath}`, error.message);
          }
        }
        
        // 对文件名列表进行排序（忽略大小写）
        fileNames.sort((a, b) => {
          return a.toLowerCase().localeCompare(b.toLowerCase());
        });


        return {
          code: 200,
          message: 'success',
          data: fileNames
        };
      } catch (error) {
        if (error.code === 'EACCES') {
          return {
            code: 403,
            message: '此文件夹不能访问',
            data: null
          };
        }
        
        return {
          code: 500,
          message: error.message,
          data: null
        };
      }
    }
  } catch (error) {
    return {
      code: 500,
      message: error.message,
      data: null
    };
  }
}

module.exports = { fileList };